package com.mk.magic_c.dto;

import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 孔德成
 * @slogan 致敬大师，致敬未来的你
 * @date 2021/10/2 7:18 下午
 * @desc 分页参数
 */
@Data
public class PaginationParam<T> {
    /**
     * 当前页码
     */
    private Integer pageNum;
    /**
     * 页面容量
     */
    private Integer pageSize;
    /**
     * 总页数
     */
    private Integer totalPage;
    /**
     * 总数据大小
     */
    private Long total;
    /**
     * 跳转路径 -> thymeleaf
     */
    private String path;
    /**
     * 页码列表
     */
    private List<Integer> pageSequence;
    /**
     * 是否存在下一页
     */
    private boolean hasNext;
    /**
     * 是否存在上一页
     */
    private boolean hasPrev;
    /**
     * 数据列表
     */
    private List<T> list;


    /**
     * 将MyBatis Plus 分页结果转化为通用结果
     */
    public static <T> PaginationParam<T> restPage(Page<T> pageResult) {
        PaginationParam<T> result = new PaginationParam<>();
        result.setPageNum(Convert.toInt(pageResult.getCurrent()));
        result.setPageSize(Convert.toInt(pageResult.getSize()));
        result.setTotal(pageResult.getTotal());
        result.setTotalPage(Convert.toInt(pageResult.getTotal() / pageResult.getSize() + 1));
        result.setList(pageResult.getRecords());
        result.setPageSequence(2);
        result.setHasNext(pageResult.hasNext());
        result.setHasPrev(pageResult.hasPrevious());
        return result;
    }

    /**
     * 生成分页序列
     *
     * @param left  左边个数
     * @param right 右边个数
     */
    private void setPageSequence(int left, int right) {
        this.pageSequence = new ArrayList<>();
        // left = 2
        // right = 2
        // pageNum = 5
        // pageSequence = [3,4,5,6,7]
        int midPage = this.pageNum;
        for (int i = left; i > 0; i--) {
            int p = midPage - i;
            if (p > 0) {
                this.pageSequence.add(p);
            }
        }
        for (int i = midPage; i < midPage + right + 1; i++) {
            if (i <= this.totalPage) {
                this.pageSequence.add(i);
            }
        }
    }

    /**
     * 生成分页序列
     *
     * @param num 左边和右边相等
     */
    private void setPageSequence(int num) {
        this.setPageSequence(num, num);
    }

}
